package com.backend.test.test;

import com.backend.mapper.UserMapper;
import com.backend.pojo.domain.User;
import com.backend.pojo.dto.LeaveRequestDTO;
import com.backend.pojo.entity.CourseMaterial;
import com.backend.service.CourseService;
import com.backend.service.impl.StuServiceImpl;
import com.backend.service.impl.UserServiceImpl;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import static org.junit.jupiter.api.Assertions.*;

import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;

@SpringBootTest
@ExtendWith(MockitoExtension.class)
public class demo2 {

    @Autowired
    private CourseService courseService;

    @Autowired
    UserServiceImpl userService;

    private SimpleDateFormat sdf;

    /**
     * 查询所有资料
     */
    @Test
    public void selectTest(){

        CourseMaterial courseMaterial = new CourseMaterial();
        courseMaterial.setMaterialName("");

      //  屏蔽上面那条  模糊查询  查询名字中带2的资料 ，courseMaterial.setMaterialName("2");

        List<CourseMaterial> courseMaterialList =  courseService.CourseQuery(courseMaterial);

        System.out.println(courseMaterialList);

    }

    /**
     * 课程资料添加测试
     */

    @Test
    public void Add(){

        CourseMaterial courseMaterial = CourseMaterial.builder().
        materialName("软件系统报告书2222222222222222")
        .downloadUrl("https://weiawei-test.oss-cn-shenzhen.aliyuncs.com/8e1075d8-1351-45fd-b804-8f3d7a1b6e84.docx")
                .materialDescription("这是一份软件系统报告书222222222222")
                .build();
        courseService.add(courseMaterial);

    }


    /**
     * 课程资料删除测试，找到对应的id ，进行删除
     */
    @Test
    public void deleteCourse(){

        courseService.deleteById(9);

    }

    /**
     * 课程资料修改测试   徐修改对应的id
     */
    @Test
    public void updateCourse(){
        CourseMaterial courseMaterial = CourseMaterial.builder().id(10).
                materialName("软件系统报告书hahahahaha")
                .downloadUrl("https://weiawei-test.oss-cn-shenzhen.aliyuncs.com/8e1075d8-1351-45fd-b804-8f3d7a1b6e84.docx")
                .materialDescription("这是一份软件系统报告书222222222222")
                .build();
        courseService.update(courseMaterial);


    }


    @Mock
    private UserMapper studentMapper;  // 模拟数据访问层
    
    @InjectMocks
    private StuServiceImpl stuService;
    


    @Test
    void leaveRequest1() throws ParseException {
        LeaveRequestDTO dto = new LeaveRequestDTO();
        sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 设置测试数据...
        // 设置基本信息
        dto.setUserId("2024001");
        dto.setUserName("张三");
        dto.setTel("13800138000");

        // 设置请假详情
        dto.setLschool("是");  // 是否离校
        dto.setLcity("否");    // 是否离市
        dto.setAddr("回家");    // 离校目的
        dto.setContact("李四"); // 紧急联系人
        dto.setType("事假");    // 请假类型

        // 设置时间
        dto.setDate1(sdf.parse("2024-03-20 08:00:00")); // 开始时间
        dto.setDate2(sdf.parse("2024-03-22 18:00:00")); // 结束时间

        // 设置其他信息
        dto.setDesc("家中有事，需要请假处理");  // 请假理由
        dto.setTeacherName("王老师");         // 任课老师
        dto.setTeacherId(1001);             // 教师ID
        dto.setStatus(0);                   // 初始状态：待审核
        stuService.leave(dto);
    }

    @Test
    void leaveRequest2() throws ParseException {
        LeaveRequestDTO dto = new LeaveRequestDTO();
        sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 设置测试数据...
        // 设置基本信息
        dto.setUserId("2024002");
        dto.setUserName("张三");
        dto.setTel("13800138000");

        // 设置请假详情
        dto.setLschool("是");  // 是否离校
        dto.setLcity("否");    // 是否离市
        dto.setAddr("回家");    // 离校目的
        dto.setContact("李四"); // 紧急联系人
        dto.setType("事假");    // 请假类型

        // 设置时间

         // 开始时间
        dto.setDate1(sdf.parse("2024-03-22 18:00:00"));
        dto.setDate2(sdf.parse("2024-03-20 08:00:00"));
        // 结束时间
        //测试开始时间大于结束时间会怎么样

        // 设置其他信息
        dto.setDesc("家中有事，需要请假处理");  // 请假理由
        dto.setTeacherName("王老师");         // 任课老师
        dto.setTeacherId(1001);             // 教师ID
        dto.setStatus(0);                   // 初始状态：待审核
        stuService.leave(dto);
    }

    @Test
    void leaveRequest3() throws ParseException {
        LeaveRequestDTO dto = new LeaveRequestDTO();
        sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 设置测试数据...
        // 设置基本信息
        dto.setUserId("2024001");
        dto.setUserName("张三");
        dto.setTel("13800138000");

        // 设置请假详情
        dto.setLschool("是");  // 是否离校
        dto.setLcity("否");    // 是否离市
        dto.setAddr("回家");    // 离校目的
        dto.setContact("李四"); // 紧急联系人
        dto.setType("事假");    // 请假类型
        // 设置时间
        //时间为空测试
        // 设置其他信息
        dto.setDesc("家中有事，需要请假处理");  // 请假理由
        dto.setTeacherName("王老师");         // 任课老师
        dto.setTeacherId(1001);             // 教师ID
        dto.setStatus(0);                   // 初始状态：待审核
        stuService.leave(dto);
    }

    @Test
    void leave_WithValidData_ShouldSucceed() throws ParseException {

        LeaveRequestDTO dto = new LeaveRequestDTO();
        sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 设置测试数据...
        // 设置基本信息
        dto.setUserId("2024004");
        dto.setUserName("张三");
        dto.setTel("13800138000");

        // 设置请假详情
        dto.setLschool("是");  // 是否离校
        dto.setLcity("否");    // 是否离市
        dto.setAddr("回家");    // 离校目的
        dto.setContact("李四"); // 紧急联系人
        dto.setType("事假");    // 请假类型

        // 设置时间
        dto.setDate1(sdf.parse("2024-03-20 08:00:00")); // 开始时间
        dto.setDate2(sdf.parse("2024-03-22 18:00:00")); // 结束时间

        // 设置其他信息
        dto.setDesc("家中有事，需要请假处理");  // 请假理由
        dto.setTeacherName("王老师");         // 任课老师
        dto.setTeacherId(1001);             // 教师ID
        dto.setStatus(0);                   // 初始状态：待审核
        // 执行请假方法
        stuService.leave(dto);

        // 验证是否调用了mapper的相关方法
        verify(studentMapper).leave(any());
    }

    @Test
    public void testSelectById() {
        // 模拟数据库查询结果
        User expectedUser = new User();
        expectedUser.setUserId("2345");
        expectedUser.setUserName("测试");// 调用待测试方法
        expectedUser.setSort("普通用户");
        expectedUser.setPassword("123");
        expectedUser.setMail("无");
        expectedUser.setPhone("无");
        expectedUser.setAddress("无");
        User actualUser = userService.selectById("2345");

        // 断言查询结果是否与预期一致
        assertEquals(expectedUser, actualUser);
    }


    @Test
    public void testSelectById1() {
        // 模拟数据库查询结果
        User expectedUser = new User();
        expectedUser.setUserId("1234");
        expectedUser.setUserName("root");

        // 调用待测试方法

        User actualUser = userService.selectById("1234");

        // 断言查询结果是否与预期一致
        assertEquals(expectedUser, actualUser);
    }


}
